import os, sys, math

#Se agrega al path la carpeta ../lib
modulesdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../lib'))
sys.path.insert(0, modulesdir)

#Se agrega al path la carpeta ../
modulesdir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../'))
sys.path.insert(0, modulesdir)

from lib.euclid import Vector3
from library import *

from OpenGL.GLUT import *
from OpenGL.GL import *
from OpenGL.GLU import *


class Punto(Library):
    def __init__(self, identifier, escena,  parameters):
        #parameters
        name = parameters[0]
        x = parameters[1]
        y = parameters[2]
        z = parameters[3]
        
        self.escena = escena
        
        self.punto = Vector3(x, y, z)
        #identificador
        self.identifier = identifier
        self.autoEliminate = False #para eliminar el objeto
        self.visible = True
        self.activeMover = False
        
        #color de la superficie
        import random
        red = random.random()
        green = random.random()
        blue = random.random()

        self.success = True
        self.colorToDrawPunto= (red, green, blue, 0.0)
        self.colorSelected = (0.0, 0.0, 1.0, 0.0)
        self.bSelected  = False
        self.type = 'Punto'
        self.name = name
        return 

    def getClassName():
        return 'Punto'
    getClassName = staticmethod(getClassName)

    def getNameInMenu():
        return 'Punto'
    getNameInMenu = staticmethod(getNameInMenu)

    def getParametersForCreate():
        title = 'Indique los parametros para crear una NURBS'
        parameters = [title, 
                      ('Nombre:', str), 
                      ('Posicion x:', float), 
                      ('Posicion y:', float), 
                      ('Posicion z:', float), 
                      ]
        return parameters
    getParametersForCreate = staticmethod(getParametersForCreate)
    
    def draw(self, selectMode=False, moving = True):
    #se setean los colores
        if(self.visible):
            if(not selectMode):
                #modo de renderizado normal
                color = self.colorToDrawPunto
                if(self.bSelected):
                    #admeas de no estar en modo seleccion esta seleccionado
                    colorPlano = self.colorSelected
            else:
                #modo de seleccion, identifier representa a un color
                inc = (1.0/255)
                red = (inc) * self.identifier
                color = (red, red, red,  0)
                
            #Dibuja una esfera para representar al Punto
            origen = self.punto
            radius = 0.1
            slices = 10
            stacks = 10
            self.draw_sphere(origen,  radius, slices, stacks, color)

#CallBack Mouse
    def Mouse(self, x, y, camara, plano):
        #Identifica si el punto fue seleccionado
        tolerance = 0.5
        pos = self.convertTo3D(x, y)
        recta = [camara.eyes, pos]
        if(self.punto.inRect(recta, tolerance)):
            plano.desplazar(self.punto)
        return

    def Motion(self, x, y, width, heigth, camara, plano):
        if(self.activeMover):#EDITAR el punto
            pos = self.convertTo3D(x, y)
            recta = [camara.eyes, pos]
            puntoNuevo = plano.interseccion(recta)
            plano.desplazar(puntoNuevo)
            self.punto = puntoNuevo
        return 0

    def getPunto(self):
        return self.punto

    def setPunto(self,widget, spinbutton_widget1,spinbutton_widget2,spinbutton_widget3):
        valorX = spinbutton_widget1.get_value()
        valorY = spinbutton_widget2.get_value()
        valorZ = spinbutton_widget3.get_value()
        valorV=Vector3(valorX,valorY,valorZ);      
        self.punto = valorV
        return True

    def atributesToEdit(self):
        self.atributes = {'Coords': (self.getPunto(), lambda widget,spinner1,spinner2,spinner3:  self.setPunto(widget,spinner1,spinner2,spinner3))}
        return self.atributes

    def actionsToDo(self):
        
        ver = '01-Ocultar Punto'
        mover = '02-No Mover Punto'
        
        if(not self.visible):
            ver = '01-Mostrar Punto'
        if(not self.activeMover):
            mover = '02-Mover Punto'
        
        self.actions = {
                                mover:  (lambda x: self.setMover(), ''), 
                                ver:    (lambda x: self.setVisible(), ''), 
                                '03-Eliminar': (lambda x: self.eliminarse(), '')
                        }
        return self.actions.keys()

    def setVisible(self):
        self.visible = not self.visible

    def setMover(self):
        self.activeMover = not self.activeMover

    def eliminarse(self):
        self.autoEliminate = True
        return
